package com.gx.mvp.net;

import com.google.gson.Gson;
import java.io.IOException;
import java.lang.reflect.Type;
import okhttp3.ResponseBody;
import org.json.JSONException;
import org.json.JSONObject;
import retrofit2.Converter;

/**
 * Created by Guoxin on 2019-12-07.
 */
public class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {

    private final Gson gson;
    private final Type type;

    public GsonResponseBodyConverter(Gson gson, Type type) {
        this.gson = gson;
        this.type = type;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
        try {
            JSONObject jsonObject = new JSONObject();
            JSONObject result = new JSONObject(value.string());
            // 如果请求成功，就包装一层公共字段，直接解析返回
            if (result.has("status") && "success".equals(result.get("status"))) {
                jsonObject.put("data", result);
                jsonObject.put("status", result.get("status"));
                return gson.fromJson(jsonObject.toString(), type);
            }
            // 如果请求失败，包装一个空的 data 字段返回。
            else if (result.has("status") && "error".equals(result.get("status"))) {
                jsonObject.put("status", "error");
                if (result.has("errorMsg")) {
                    jsonObject.put("errorMsg", result.get("errorMsg"));
                }
                return gson.fromJson(jsonObject.toString(), type);
            }
            // 如不是自己服务器的接口，一律按照成功执行，成功失败的逻辑交由下层处理
            else {
                jsonObject.put("status", "success");
                jsonObject.put("data", result);
                return gson.fromJson(jsonObject.toString(), type);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}
